在 OLAP 系統中,「即時聚合」與「預先計算」是加速查詢、降低資源消耗的核心策略。ClickHouse 提供了強大的 Materialized Views,能將複雜查詢結果實時寫入表中,並大幅減輕查詢時的運算壓力。
Materialized View 是一種 帶有持久化儲存結果的查詢視圖,當有資料寫入源表 (source table) 時,ClickHouse 會自動根據定義的 SELECT 查詢語句計算並將結果寫入目標表 (target table)。
簡單來說,它就是一種「自動觸發的 Insert + 聚合查詢 + 寫入彙總表」的機制。
SummingMergeTree
/ AggregatingMergeTree
等。CREATE TABLE events
(
event_time DateTime,
page String,
user_id UInt64,
views UInt32
) ENGINE = MergeTree
ORDER BY (event_time, page);
CREATE TABLE daily_page_views
(
date Date,
page String,
total_views UInt32
) ENGINE = SummingMergeTree
PARTITION BY toYYYYMM(date)
ORDER BY (date, page);
CREATE MATERIALIZED VIEW mv_daily_page_views
TO daily_page_views
AS SELECT
toDate(event_time) AS date,
page,
sum(views) AS total_views
FROM events
GROUP BY date, page;
每當資料寫入 events
表時,ClickHouse 會自動計算每天每頁面的瀏覽量,並寫入 daily_page_views
表中。
events
daily_page_views
daily_page_views
時直接取用彙總結果應用場景 | 說明 |
---|---|
高頻查詢彙總結果表 (Dashboard/BI 報表) | 先將重計算的聚合結果寫入目標表,查詢時僅需掃小型表格 |
即時Event Streaming彙總 (如 PV/UV 統計) | 結合 Kafka + MV,即時統計點擊數、瀏覽量等 |
指標統計與彙總 (Metrics Storage) | 以 Materialized View 實時計算指標數據,適合 IoT、監控平台 |
ReplacingMergeTree 或 SummingMergeTree 結合 | 目標表可以使用去重、聚合引擎進一步優化結果儲存 |
Materialized View 是寫入目標表的「Trigger」,Target Table 必須先建立好。
MV 只會針對「新寫入」的資料進行聚合,不會針對舊資料補算,若源表有歷史資料變動需手動重算。
目標表應搭配適當的 MergeTree 引擎(Summing
, Aggregating
, Replacing
)來對應資料處理需求。
MV 只會針對 INSERT 事件觸發,若需進行補資料、資料刪除,需配合 ReplacingMergeTree
或 Mutation 處理。
若 Materialized View 建立時希望自動將 Source Table 的歷史資料也計算入目標表,可以使用 POPULATE
關鍵字。
CREATE MATERIALIZED VIEW mv_daily_page_views POPULATE
TO daily_page_views
AS SELECT
toDate(event_time) AS date,
page,
sum(views) AS total_views
FROM events
GROUP BY date, page;
類型 | 說明 | 主要用途 |
---|---|---|
Materialized View | INSERT 時將查詢結果實體化寫入表 | 即時聚合、資料彙總 |
View (普通 View) | 查詢時執行 SELECT,無資料儲存 | 簡化複雜查詢語法 |
LIVE View | 基於資料更新自動推送查詢結果 (類似 Streaming Query) | 即時查詢動態(但性能較重,不建議大數據場景使用) |
實踐策略 | 說明 |
---|---|
搭配 SummingMergeTree 做高效加總表 | 透過 MV 將大量原始數據彙總到小表,提高查詢性能 |
Materialized View 支援多層級彙總 | 可以鏈接多個 MV 形成逐層聚合 (日 → 週 → 月),減少查詢即時計算量 |
針對大表建 MV 時善用 Partition Key | 讓彙總結果根據日期或業務維度分區,減少寫入與查詢時的 I/O 開銷 |
小心 Insert 負擔 | 每次寫入都會觸發一次子查詢,若 MV 設計過於複雜會影響寫入效能 |
與 Kafka Engine 整合,實現流式彙總 | MV 可直接從 Kafka Source 自動消費並寫入聚合結果表 |
Materialized View 提供了一種「自動計算、實時寫入」的聚合機制,讓 ClickHouse 能在高寫入吞吐量下依然保持查詢效能。透過合理設計源表、目標表、聚合邏輯與表引擎選擇,Materialized View 可成為數據分析場景中的效能加速器。